package com.lx.service.impl;

import com.antherd.smcrypto.sm3.Sm3;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lx.dao.UserDao;

import com.lx.entity.User;
import com.lx.exceptionHandler.NameException;
import com.lx.exceptionHandler.PasswordException;
import com.lx.service.UserService;
import com.lx.util.JwtUtil;

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;
    @Autowired
    ElasticsearchRestTemplate esTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    @Override
    public List<User> getAllUser() {
        return userDao.selectAll();
    }

//    @Override
//    public PageInfo<User> getPageInfo(Map<String, Object> params) {
//        PageInfo<User> pageInfo=new PageInfo<>();
//        Integer pageNum=Integer.parseInt(params.get("pageNum").toString());
//        Integer pageSize=Integer.parseInt(params.get("pageSize").toString());
//        NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();
//        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//        if(params.containsKey("userName")){
//            boolQueryBuilder.should(QueryBuilders.matchQuery("userName", params.get("userName")));
//
//        }
//        if (params.containsKey("createTime") && params.get("createTime") != null) {
//            String createTimeStr = params.get("createTime").toString();
//
//            if (!createTimeStr.isEmpty()) {
//                try {
//                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//                    Date date = sdf.parse(createTimeStr);
//
//                    // 使用范围查询：查询指定日期的所有新闻
//                    Date startDate = new Date(date.getTime() - 24 * 60 * 60 * 1000);
//                    Date endDate = new Date(date.getTime() + 24 * 60 * 60 * 1000); // 当天结束时间
//
//                    boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime")
//                            .gte(startDate)
//                            .lte(endDate));
//                } catch (ParseException e) {
//
//                    boolQueryBuilder.must(QueryBuilders.termQuery("createTime", createTimeStr));
//                }
//            }
//        }
//        queryBuilder.withQuery(boolQueryBuilder);
//        queryBuilder.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));
//
//
//        //高亮
//        HighlightBuilder highlightBuilder=new HighlightBuilder();
//        highlightBuilder.field("userName")
//                .field("createTime")
//                .preTags("<span style='color:red'>")
//                .postTags("</span>");
//        queryBuilder.withHighlightBuilder(highlightBuilder);
//        queryBuilder.withPageable(PageRequest.of((pageNum - 1), pageSize));
//
//        //结果高亮
//        SearchHits<User> hits=esTemplate.search(queryBuilder.build(), User.class);
//        List<User> userList=new ArrayList<>(pageSize+5);
//        for(SearchHit<User> hit :hits.getSearchHits()){
//            User user= hit.getContent();
//            Map<String, List<String>> highLightMap = hit.getHighlightFields();
//            if(!highLightMap.isEmpty()){
//                // 处理 title 高亮
//                List<String> userNameList = highLightMap.get("userName");
//                if (userNameList != null && !userNameList.isEmpty()) {
//                    user.setUserName(userNameList.get(0));
//                }
//
//                // 处理 createTime 高亮
//                List<String> createTimeList = highLightMap.get("createTime");
//                if (createTimeList != null && !createTimeList.isEmpty()) {
//                    String highlightedCreateTime = createTimeList.get(0);
//                    // 去除HTML标签
//                    String cleanDate = highlightedCreateTime.replaceAll("<[^>]*>", "");
//                    try {
//                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//                        Date date = dateFormat.parse(cleanDate);
//                        user.setCreateTime(date);
//                    } catch (ParseException e) {
//                        // 解析失败时使用原始值或记录日志
//                        // 可以选择不设置该字段，保持原始值
//                    }
//                }
//            }
//            userList.add(user);
//        }
//        pageInfo.setPageNum(pageNum);
//        pageInfo.setPageSize(pageSize);
//        pageInfo.setTotalCount((int)hits.getTotalHits());
//        pageInfo.setList(userList);
//        return pageInfo;
//    }

    @Override
    public PageInfo<User> getPageInfo(Map<String, Object> params) {
        int pageNum = 1;
        int pageSize = 5;
        if (params.containsKey("pageNum")) {
            pageNum = Integer.parseInt(params.get("pageNum").toString());
        }
        if (params.containsKey("pageSize")) {
            pageSize = Integer.parseInt(params.get("pageSize").toString());
        }
        PageHelper.startPage(pageNum, pageSize);
        List<User> userList = userDao.selectAllByCondition(params);

        PageInfo<User> pageInfo = new PageInfo<>(userList);
        return pageInfo;
    }

    @Override
    public User selectById(Integer id) {
        return userDao.selectById(id);
    }

    @Override
    public User getUserByLoginName(String userName) {
        return userDao.existLoginName(userName);
    }

    @Override
    public Map<String, Object> login(String loginName, String password) {
        User user = userDao.existLoginName(loginName);
        String sign = Sm3.sm3(password);
        if(user == null) {
            throw new NameException();
        }else if(!sign.equals(user.getPassword())) {
            throw new PasswordException();
        }
        Map<String, Object> params = new HashMap<>();
        String jwt = JwtUtil.createToken(user.getId());
        stringRedisTemplate.opsForValue().set(user.getId().toString(), jwt, 30, TimeUnit.MINUTES); //token存在redis中 原 30
        params.put("token", jwt);
        params.put("loginName", loginName);
        params.put("type",  user.getType());
        //返回数据，根据前端请求判断是否要
        return params;
    }

    @Override
    public boolean addUser(User user) {
        return userDao.addUser(user)>0;
    }

    @Override
    public boolean updateUser(User user) {
        return userDao.updateUser(user)>0;
    }

    @Override
    public boolean modifyUser(User user, String oldPassword,String newPassword) {
        User existingUser = userDao.existLoginName(user.getLoginName());
        if(existingUser != null && !existingUser.getId().equals(user.getId())){
            throw new NameException();
        }

        // 验证原密码是否正确
        User currentUser = userDao.selectById(user.getId());
        String oldPasswordHash = Sm3.sm3(oldPassword);
        if(!oldPasswordHash.equals(currentUser.getPassword())){
            throw new PasswordException();
        }

        // 设置新密码
        if(newPassword != null && !newPassword.isEmpty()) {
            user.setPassword(Sm3.sm3(newPassword));
        }

        return userDao.modifyUser(user, oldPassword,newPassword)>0;
    }


    @Override
    public boolean delUser(Integer id) {
        return userDao.delUser(id)>0;
    }
}
